//
// Created by Jisam on 01/09/2024 6:02 PM.
// Solution of  P5440 【XR-2】奇迹
// 2024-09-01 18:33:34 AC100

//#pragma GCC optimize(3)
#include <bits/stdc++.h>

using namespace std;
#define endl "\n"
#define PSI pair<string,int>
#define PII pair<int,int>
#define PDI pair<double,int>
#define PDD pair<double,double>
#define VVI vector<vector<int>>
#define VI vector<int>
#define VS vector<string>
#define PQLI priority_queue<int, vector<int>, less<int>>
#define PQGI priority_queue<int, vector<int>, greater<int>>
#define code_by_jisam ios::sync_with_stdio(false),cin.tie(nullptr),cout.tie(nullptr)
typedef long long i64;
typedef unsigned u32;
typedef unsigned long long u64;
typedef __int128 i128;
int dx[] = {-1, 1, 0, 0, 1, 1, -1, -1,};
int dy[] = {0, 0, -1, 1, 1, -1, -1, 1,};

// 声明变量和数组
int n, a[9], prim[10005], flag[10005], tot;
char tmpc;
// 存储1到10000的幂次
int p10[] = {1, 10, 100, 1000, 10000, 100000, 1000000, 10000000, 100000000};
// 存储每个月的天数信息
int yue[] = {0, 1, 0, 1, 0, 1, 0, 1, 1, 0, 1, 0, 1};

// 初始化质数表
inline void init() {
    // 1不是质数，标记为已处理
    flag[1] = 1;
    // 埃拉托斯特尼筛法，找出所有质数
    for (int i = 2; i < 10005; i++) {
        // 如果当前数未被标记，则为质数，加入数组
        if (!flag[i]) prim[++tot] = i;
        // 将当前质数与已知质数相乘，标记合数
        for (int j = 1; j <= tot; j++) {
            if (i * prim[j] >= 10005) break;
            flag[i * prim[j]] = 1;
            // 如果当前数是该质数的倍数，停止内循环
            if (i % prim[j] == 0) break;
        }
    }
    // 无需返回值
    return;
}

// 判断是否为闰年
inline int pdrn(int x) {
    // 如果满足闰年的条件，返回1，否则返回0
    return (x % 4 == 0 && x % 100 != 0) || (x % 400 == 0 && x % 3200 != 0);
}

// 判断是否为质数
inline int pdzs(int x) {
    // 小于2的数不是质数
    if (x < 2) return 0;
    // 遍历已知质数，判断是否能整除
    for (int i = 1; i <= tot; i++)
        if (x % prim[i] == 0) return x == prim[i];
    // 如果没有被任何质数整除，是质数
    return 1;
}

// 深度优先搜索函数，判断给定数字是否满足特定日期的条件
int dfs(int nown, int num, int rn, int jy) {
    // 如果已经处理完所有数字
    if (nown == 0) {
        // 数字不能小于10000
        if (num / 10000 == 0) return 0;
        // 如果是闰年，且年份不是闰年，返回0
        if (rn && pdrn(num / 10000) == 0) return 0;
        // 判断是否为质数
        return pdzs(num);
    }
    // 处理月份
    if (nown == 6) {
        // 不是有效日期，或者超过31天，或者不是质数，返回0
        if (num == 0 || num > 31 || !pdzs(num)) return 0;
        // 如果是31号，标记为真
        if (num == 31) jy = 1;
    }
    // 处理日期
    if (nown == 4) {
        // 不是有效日期，或者不在合理范围内，或者不是质数，返回0
        if (num < 32 || num > 1231 || !pdzs(num)) return 0;
        // 如果是润四月，且当前月没有31天，返回0
        if (jy && !yue[num / 100]) return 0;
        // 如果是二月
        if (num / 100 == 2) {
            // 天数大于29，返回0
            if (num % 100 > 29) return 0;
            // 如果是29号，标记为闰年
            if (num % 100 == 29) rn = 1;
        }
    }
    // 如果当前位置的数字已知
    if (a[nown] != -1) return dfs(nown - 1, a[nown] * p10[8 - nown] + num, rn, jy);
    // 否则，遍历0到9，递归搜索
    int res = 0;
    for (int i = 0; i <= 9; i++) res += dfs(nown - 1, i * p10[8 - nown] + num, rn, jy);
    // 返回满足条件的总数
    return res;
}

// 获取下一个数字
char get() {
    char ch = getchar();
    // 跳过非数字字符
    while ((ch < '0' || ch > '9') && ch != '-') ch = getchar();
    return ch;
}

// 输出数字x
void put(int x) {
    // 递归输出每一位数字
    if (x > 9) put(x / 10);
    putchar('0' + x % 10);
    return;
}

// 主解算函数
void solution() {
    // 读取并处理输入的数字
    for (int i = 1; i <= 8; i++) tmpc = get(), a[i] = (tmpc == '-' ? -1 : tmpc - '0');
    // 使用深度优先搜索计算满足条件的日期总数，并输出结果
    put(dfs(8, 0, 0, 0)), putchar('\n');
}

int main() {
//    code_by_jisam;
    init();
    int T = 1;
    cin >> T;
    while (T--) {
        solution();
    }
    return 0;
}